<?php

namespace app\bbxw\command;


use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use think\admin\Command;
use think\console\Input;
use think\console\Output;
use DateTime;
/**
 * 订单导入
 * Class SmsNum
 * @package app\common\command
 */
class ImportOrder extends Command
{
    /**
     * 配置指令
     */
    protected function configure()
    {
        $this->setName('xbbxw:importOrder');
        $this->setDescription('importOrder');
    }

    protected function execute(Input $input, Output $output)
    {
        ini_set('memory_limit', '-1');
        ini_set('max_execution_time', 0); // 不限制最大执行时间
        $queue_data = $this->queue->data;
        $this->setQueueProgress("正在解析数据,请稍等...", 0);
        $path = $queue_data['path'];
        $this->app->log->error($path);

        // 指定要读取的Excel文件路径
        $spreadsheet = IOFactory::load($path);

        // 获取工作表
        $worksheet = $spreadsheet->getActiveSheet();

        // 初始化一个数组来存储符合条件的记录
        $processedData = [];
        // 遍历工作表中的每一行，从第二行开始
        $rowIterator = $worksheet->getRowIterator();

        // $rowIterator->current()->next(); // 跳过第一行
        // 遍历工作表中的每一行
        foreach ($rowIterator as $row) {
            // 获取当前行的行号
            $rowIndex = $row->getRowIndex();

            // 获取当前行的单元格
            $cellIterator = $row->getCellIterator();
            $cellIterator->setIterateOnlyExistingCells(FALSE); // 这个设置可以让循环包含所有单元格，即使它们没有值

            // 创建一个数组来存储这一行的数据
            $rowData = [];

            foreach ($cellIterator as $k=>$cell) {

                // 获取单元格的值
                $value = $cell->getValue();
                if($k=="A"){
                    // 处理包含`=ROW()-2`公式的单元格
                    if (is_string($value) && strpos($value, '=ROW()-2') !== false) {
                        $value = $rowIndex - 2;
                    }
                }
                if($k=="B"){
                    // 处理日期数据
                    if (is_numeric($value)) {
                        // 尝试将Excel日期序列号转换为标准日期格式
                        try {
                            $value = Date::excelToDateTimeObject($value)->format('Y-m-d');
                        } catch (\Exception $e) {
                            // 如果转换失败，保持原值
                        }
                    }
                }



                // 将处理后的值添加到行数据数组中
                $rowData[] = $value;
            }

            // 将处理后的行数据添加到结果数组中
            $processedData[] = $rowData;
        }
        // dump($processedData);
        $order_data = [];
        foreach ($processedData as $k=>$v){
            if($v[3]&&$k!=0){
                $order_data[]=$v;
            }
        }
        $total= count($order_data);
        $count = 0;
        //$data = $this->app->db->name("customer")->where(['name'=>"admin"])->value('id');dump($data);exit;
        $save_data=[];
        $num = 0;
        foreach ($order_data as $v){
            $name = $v[3];

            $customer_id = $this->app->db->name("customer")->where(['name'=>$name])->value('id');
            // dump($uid);
            $power_source_id=null;
            if(empty($customer_id)){
                $customer_id = $this->app->db->name("customer")->insertGetId(['name'=>$name,'nickname'=>$v[4],'password'=>md5("123123")]);
            }
            if(!empty($v[8])){
                $power_source_id = $this->app->db->name("power_source")->where(['name'=>$v[8]])->value('id');
                if(empty($power_source_id)){
                    $power_source_id = $this->app->db->name("power_source")->insertGetId(['name'=>$v[8]]);
                }
            }
            //dump(111);
            $save_data = [
                'sort'=>$v[0]??null,
                'date'=>$this->formatDate($v[1])??null,
                'group_number'=>$v[2]??null,
                'customer_name'=>$v[3]??null,
                'nickname'=>$v[4]??null,
                'activity_gift'=>$v[5]??null,
                'play_duration_h'=>$v[6]??null,
                'order_quantity'=>$v[7]??null,
                'power_source'=>$v[8]??null,
                'receptionist'=>$v[9]??null,
                'collector'=>$v[10]??null,
                'business_amount'=>$v[11]??null,
                'payment_method'=>$v[12]??null,

                'non_business_income'=>$v[13]??null,
                'non_business_expense'=>$v[14]??null,
                'refund_dove_fee'=>$v[15]??null,

                'prepaid_amount'=>$v[16]??null,
                'remarks'=>$v[17]??null,
                'customer_id'=>$customer_id??null,
                'power_source_id'=>$power_source_id??null,
            ];
            $this->app->db->name("play_accompany")->insert($save_data);
            $this->queue->message($total, ++$count, "插入【{$v[3]}】的数据完成");
            $num++;

        }
        //$this->app->log->error(json_encode($save_data));
       // $num = $this->app->db->name("play_accompany")->insertAll($save_data);
        $this->setQueueProgress("导入成功,请刷新页面", 100);
        sysqueue("更新用户数据", "xbbxw:updataCustomer", $later = 10, ['num'=>$num], $rscript = 1, $loops = 0);
        $this->setQueueProgress("javascript:location.reload();");

        $this->setQueueSuccess("导入成功,请刷新页面");
    }

    /**
     * 格式化日期字符串或数值为标准的日期格式
     *
     * 该方法旨在将给定的日期信息（无论是字符串还是Excel序列号）转换为统一的标准日期格式（YYYY-MM-DD）
     * 它首先检查输入是否为数值，如果是，则假定为Excel日期序列号并尝试转换如果输入是字符串，
     * 则尝试使用一系列预定义的日期格式进行解析，直到成功转换或所有格式都尝试完毕
     *
     * @param mixed $value 日期值，可以是字符串表示的日期或Excel日期序列号
     * @return string 标准格式的日期字符串（YYYY-MM-DD），如果无法解析则返回原始值
     */
    public function formatDate($value,$format='Y-m-d')
    {
        // 处理日期数据
        if (is_numeric($value)) {
            // 尝试将Excel日期序列号转换为标准日期格式
            try {
                $value = Date::excelToDateTimeObject($value)->format($format);
            } catch (\Exception $e) {
                // 如果转换失败，保持原值
            }
        } else {
            // 尝试多种日期格式进行解析
            $dateFormats = [
                'Y-m-d',       // 2021-01-01
                'd/m/Y',       // 01/01/2021
                'm-d-Y',       // 01-01-2021
                'Y/m/d',       // 2021/01/01
                'd.m.Y',       // 01.01.2021
                'm.d.Y',       // 01.01.2021
                'Ymd',         // 20210101
                'dmY',         // 01012021
                'mdY',         // 01012021
                'Y.n.j',       // 2021.1.1
                'Y.m.d',       // 2021.01.01
                'd-M-Y',       // 01-Jan-2021
                'M-d-Y',       // Jan-01-2021
                'Y-M-d',       // 2021-Jan-01
                'd F Y',       // 01 January 2021
                'F d Y',       // January 01 2021
                'd M Y H:i:s', // 01 Jan 2021 12:34:56
                'M d Y H:i:s', // Jan 01 2021 12:34:56
                'Y M d H:i:s', // 2021 Jan 01 12:34:56
                'd F Y H:i:s', // 01 January 2021 12:34:56
                'F d Y H:i:s', // January 01 2021 12:34:56
                'Y-m-d H:i:s', // 2021-01-01 12:34:56
                'd/m/Y H:i:s', // 01/01/2021 12:34:56
                'm-d-Y H:i:s', // 01-01-2021 12:34:56
                'Y/m/d H:i:s', // 2021/01/01 12:34:56
                'd.m.Y H:i:s', // 01.01.2021 12:34:56
                'm.d.Y H:i:s', // 01.01.2021 12:34:56
                'Ymd H:i:s',   // 20210101 12:34:56
                'dmY H:i:s',   // 01012021 12:34:56
                'mdY H:i:s',   // 01012021 12:34:56
                'Y.n.j H:i:s', // 2021.1.1 12:34:56
                'Y.n.d H:i:s', // 2021.01.01 12:34:56
            ];

            foreach ($dateFormats as $format) {
                $date = DateTime::createFromFormat($format, $value);
                if ($date && $date->format($format) === $value) {
                    $value = $date->format('Y-m-d');
                    break;
                }
            }
        }
        if (empty($value)) {
            return null;
        }
        return  $value;
    }
}
